package qgs.zisu.javaconcurrency.javaconcurrency.chapter9_ThreadCommunication;

import java.util.stream.Stream;

/**
 * @Author: 蔡翔
 * @Date: 2019/10/15 17:54
 * @Version 1.0
 * 一把锁 在一个线程中wait住了，，那么另外一个线程中 有synchronize(LOCK){Code1},那么Code1是不会执行的。只有当这个锁notify了才会执行
 */
public class DifferenceOfWaitAndSleep {
    // 定义锁，一定要定义成final。
    private final static Object LOCK = new Object();

    public static void main(String[] args) throws InterruptedException {

        Stream.of("T1","T2").forEach(name->{
            new Thread(name){
                @Override
                public void run(){
                    m1();
                }
            }.start();
        });
        // m2 是主线程 执行的， 如果一个线程wait住了，不去notify() 是不会往下执行的。

        m2();

        // 思路就是：m1() 抢到 LOCK锁后，m2 就得等m1 释放锁后，m2 才能执行里面的代码
    }

    public static void m1(){
        synchronized (LOCK){
            try {
                System.out.println("The Thread :"+Thread.currentThread().getName()+"enter.");
                Thread.sleep(20000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void m2(){
        synchronized (LOCK){ // 如果没有synchronize(LOCK) 直接调用wait 方法，就会报错空指针异常。
            try {
                System.out.println("The Thread :"+Thread.currentThread().getName()+"enter.");
                LOCK.wait(); // 这里对LOCK 调用 wait 方法，所以这些内容必须在 synchronize(LOCK) 内
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

}
